package rpc.remote.transport.netty.client;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.AttributeKey;
import io.netty.util.ReferenceCountUtil;
import lombok.extern.slf4j.Slf4j;
import rpc.remote.dto.RpcResponse;

/**
 * @ClassName: NettyClientHandler
 * @Description: 自定义处理服务端消息,读取服务端发过来的RpcResponse对象，并且将里面的消息保存到AttributeMap上，这样就可以通过channel和key将数据读取出来
 * channel实现了AttributeMap接口，表明了它存在AttributeMap的属性，这样我们才能读取里面的属性
 * @author: Kowk
 * @since:1.0.0
 */
@Slf4j
public class NettyClientHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg){
        try {
            RpcResponse rpcResponse = (RpcResponse) msg;
            log.info("客户端接受到消息：[{}]",rpcResponse.toString());
            //生命一个AttributeKey对象
            AttributeKey<RpcResponse> key = AttributeKey.valueOf("rpcResponse");
            //将服务端的返回结果保存到AttributeMap上，其可以看成Channel的共享数据源
            //AttributeMap的key是AttributeKey，value是Attribute
            ctx.channel().attr(key).set(rpcResponse);
            ctx.channel().close();
        }finally {
            ReferenceCountUtil.release(msg);
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.error("客户端关闭异常", cause);
        ctx.close();
    }
}
